<?php
/**
 * 一个注册器
 * 提供全局保存变量
 *
 * @author RD
 */
class Registry {
    /**
     * 实例
     */
    public static $instance = NULL;
    
    
    /**
     * 保存变量
     */
    private $_vars = array ();
    
    private function __construct () {
    }
    
    
    /**
     * 单例模式 只是在请求域的单例
     * php是多进程（线程）模式运行的，每个进程（线程）都有自己的对象
     */
    public static function getInstance () {
        if (Registry::$instance == NULL) {
            Registry::$instance = new self ();
            return Registry::$instance;
        } else
            return Registry::$instance;
    }
    
    
    /**
     * 保存对象 值
     *
     * @param $key 键名 字符串
     * @param $v 对象，值
     * @return NULL
     */
    private function setVar ($key, $v) {
        $this->_vars [$key] = $v;
    }
    
    
    /**
     * 获取注册的键名对应的对象，值
     * 目前好像找不到比较好的方法实现返回的类型为注册对象的类型
     * 
     *@param $key 键名
     *@return obj value | NULL
     */
    private function getVar ($key) {
        return (isset ($this->_vars [$key]))?$this->_vars [$key] : NULL;
    }
    
    
    /**
     * 设置 | 存储 变量
     *
     * @param $key 变量名
     * @param $value 值
     */
    public static function set ($key, $value) {
        Registry::getInstance ()->setVar ($key, $value);
    }
    
    
    /**
     * 获取变量 若不存在，则返回null
     *
     * @param $key 变量名
     * @return mixed $value
     */
    public static function get ($key) {
        return Registry::getInstance ()->getVar ($key);
    }
}